// 模块声明
mod core;
mod ui;
mod system;

// 导入必要的依赖
use tauri::{self, Manager, Emitter};
use log::{info, warn, error, debug};
use std::ffi::CString;
use winapi::um::synchapi::CreateMutexA;
use winapi::um::handleapi::CloseHandle;
use winapi::um::errhandlingapi::GetLastError;
use winapi::shared::winerror::ERROR_ALREADY_EXISTS;
use tauri_plugin_prevent_default::Flags;

// 导入各模块的公共函数
use crate::core::settings::{load_settings, save_settings, open_settings_window};
use crate::core::logger::{init_logger, cleanup_old_logs};
use crate::system::shortcuts::{get_desktop_shortcuts, launch_shortcut};
use crate::system::hotkeys::register_shortcuts_from_settings;
use crate::system::autostart::{enable_auto_start, disable_auto_start, is_auto_start_enabled, set_auto_start};
use crate::ui::window::{show_window, hide_window, set_window_always_on_top};

/// 检查应用是否已经在运行
/// 使用Windows互斥锁来确保只有一个实例运行
/// 
/// # Returns
/// * `true` - 如果应用已经在运行
/// * `false` - 如果这是第一个实例
fn is_app_already_running() -> bool {
    unsafe {
        let mutex_name = CString::new("Global\\EShortcutsAppMutex").unwrap();
        let mutex_handle = CreateMutexA(
            std::ptr::null_mut(),
            1, // bInitialOwner = TRUE
            mutex_name.as_ptr(),
        );
        
        if mutex_handle.is_null() {
            error!("创建互斥锁失败");
            return false;
        }
        
        let last_error = GetLastError();
        if last_error == ERROR_ALREADY_EXISTS {
            info!("检测到应用已经在运行，退出当前实例");
            CloseHandle(mutex_handle);
            return true;
        }
        
        // 不关闭句柄，让它在应用生命周期内保持打开状态
        // 这样其他实例就能检测到互斥锁的存在
        info!("这是应用的第一个实例，继续启动");
        false
    }
}

/// 检查是否为开发环境
/// 通过编译时标志和环境变量判断当前运行环境
/// 
/// # 返回值
/// * `bool` - true表示开发环境，false表示生产环境
fn is_dev_environment() -> bool {
    cfg!(debug_assertions) || std::env::var("TAURI_DEV").is_ok()
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    // 初始化日志系统
    if let Err(e) = init_logger() {
        eprintln!("初始化日志系统失败: {}", e);
    }
    
    // 清理7天前的旧日志文件
    if let Err(e) = cleanup_old_logs(7) {
        warn!("清理旧日志文件失败: {}", e);
    }
    
    info!("应用程序启动");
    
    // 检查是否已有实例在运行
    if is_app_already_running() {
        warn!("应用已经在运行，退出当前实例");
        std::process::exit(0);
    }
    
    // 根据环境决定是否启用开发者工具
    let enable_devtools = is_dev_environment();
    info!("开发者工具状态: {}", if enable_devtools { "启用" } else { "禁用" });
    
    // 根据环境决定是否启用防止默认行为插件
    let mut builder = tauri::Builder::default()
        .plugin(tauri_plugin_global_shortcut::Builder::new().build());
    
    // 只在开发环境启用防止默认行为插件，禁用上下文菜单等功能
    if !enable_devtools {
        let prevent_default_plugin = tauri_plugin_prevent_default::Builder::new()
            .with_flags(Flags::CONTEXT_MENU | Flags::PRINT | Flags::DOWNLOADS)
            .build();
        
        builder = builder.plugin(prevent_default_plugin);
        info!("生产环境：上下文菜单已禁用，包括共享、另存为、刷新等选项");
    } else {
        info!("开发环境：保持默认上下文菜单功能");
    }
    
    builder
        .setup(move |app| {
            // 初始化窗口位置和大小
            if let Some(_window) = app.get_webview_window("main") {
                if let Err(e) = show_window(app.handle().clone()) {
                    warn!("初始化窗口位置失败: {}", e);
                }
            }
            
            // 注册全局快捷键
            if let Err(e) = register_shortcuts_from_settings(app) {
                warn!("注册全局快捷键失败: {}", e);
            }
            
            // 创建系统托盘菜单
            let quit = tauri::menu::MenuItem::with_id(app, "quit", "退出", true, None::<&str>)?;
            let settings = tauri::menu::MenuItem::with_id(app, "settings", "设置", true, None::<&str>)?;
            let refresh = tauri::menu::MenuItem::with_id(app, "refresh", "刷新", true, None::<&str>)?;
            let menu = tauri::menu::Menu::with_items(app, &[&settings, &refresh, &quit])?;
            
            let _tray = tauri::tray::TrayIconBuilder::new()
                .icon(app.default_window_icon().unwrap().clone())
                .menu(&menu)
                .on_tray_icon_event(|tray, event| {
                    if let tauri::tray::TrayIconEvent::Click {
                        button: tauri::tray::MouseButton::Left,
                        button_state: tauri::tray::MouseButtonState::Up,
                        ..  
                    } = event {
                        debug!("托盘图标被左键点击");
                        let app = tray.app_handle();
                        if let Err(e) = show_window(app.clone()) {
                            error!("显示窗口失败: {}", e);
                        }
                    }
                })
                .on_menu_event(move |app, event| match event.id.as_ref() {
                    "quit" => {
                        debug!("用户点击退出菜单");
                        std::process::exit(0);
                    },
                    "settings" => {
                        debug!("用户点击设置菜单");
                        if let Err(e) = open_settings_window(app.clone()) {
                            error!("打开设置窗口失败: {}", e);
                        }
                    }
                    "refresh" => {
                        debug!("用户点击刷新APP菜单");
                        // 发送刷新事件到前端
                        if let Some(window) = app.get_webview_window("main") {
                            if let Err(e) = window.emit("refresh-shortcuts", ()) {
                                error!("发送刷新事件失败: {}", e);
                            } else {
                                info!("已发送刷新快捷方式事件到前端");
                            }
                        }
                    }
                    _ => {}
                })
                .build(app)?;
                
            info!("系统托盘已创建，支持左键点击显示窗口和右键菜单");
            
            Ok(())
        })
        .on_window_event(|window, event| {
            if let tauri::WindowEvent::CloseRequested { api, .. } = event {
                debug!("窗口关闭请求，隐藏到托盘");
                window.hide().unwrap();
                api.prevent_close();
            }
        })
        .invoke_handler(tauri::generate_handler![
             get_desktop_shortcuts,
             launch_shortcut,
             show_window,
             hide_window,
             set_window_always_on_top,
             load_settings,
             save_settings,
             open_settings_window,
             enable_auto_start,
             disable_auto_start,
             is_auto_start_enabled,
             set_auto_start
         ])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
